package org.example.database;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * 基于HikariCP连接池的数据库连接工具类
 */
public class HikariDatabaseConnection {
    private static HikariDataSource dataSource = null;

    static {
        try {
            // 初始化HikariCP连接池配置
            initializeDataSource();
        } catch (Exception e) {
            System.err.println("HikariCP数据源初始化失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 初始化HikariCP数据源
     */
    private static void initializeDataSource() {
        HikariConfig config = new HikariConfig();
        
        // 基本配置
        config.setJdbcUrl(DatabaseConfig.DB_URL);
        config.setUsername(DatabaseConfig.DB_USERNAME);
        config.setPassword(DatabaseConfig.DB_PASSWORD);
        config.setDriverClassName(DatabaseConfig.DB_DRIVER);
        
        // 连接池配置
        config.setMaximumPoolSize(20);          // 最大连接数
        config.setMinimumIdle(5);               // 最小空闲连接数
        config.setConnectionTimeout(30000);     // 连接超时时间(毫秒)
        config.setIdleTimeout(600000);          // 空闲连接超时时间(毫秒)
        config.setMaxLifetime(1800000);         // 连接最大存活时间(毫秒)
        config.setLeakDetectionThreshold(60000); // 连接泄漏检测阈值(毫秒)
        
        // 连接测试查询
        config.setConnectionTestQuery("SELECT 1");
        
        // 设置连接池名称
        config.setPoolName("MixueHikariPool");
        
        dataSource = new HikariDataSource(config);
        System.out.println("HikariCP连接池初始化成功！");
    }

    /**
     * 获取数据库连接
     *
     * @return Connection对象
     * @throws SQLException SQL异常
     */
    public static Connection getConnection() throws SQLException {
        if (dataSource == null) {
            throw new SQLException("数据源未初始化");
        }
        return dataSource.getConnection();
    }

    /**
     * 关闭数据源
     */
    public static void closeDataSource() {
        if (dataSource != null && !dataSource.isClosed()) {
            dataSource.close();
            System.out.println("HikariCP连接池已关闭！");
        }
    }

    /**
     * 获取当前活跃连接数
     *
     * @return 活跃连接数
     */
    public static int getActiveConnections() {
        return dataSource != null ? dataSource.getHikariPoolMXBean().getActiveConnections() : 0;
    }

    /**
     * 获取空闲连接数
     *
     * @return 空闲连接数
     */
    public static int getIdleConnections() {
        return dataSource != null ? dataSource.getHikariPoolMXBean().getIdleConnections() : 0;
    }

    /**
     * 测试HikariCP连接池连接
     */
    public static void testConnection() {
        try (Connection conn = getConnection()) {
            if (conn != null && !conn.isClosed()) {
                System.out.println("HikariCP数据库连接测试成功！");
                System.out.println("活跃连接数: " + getActiveConnections());
                System.out.println("空闲连接数: " + getIdleConnections());
            } else {
                System.err.println("HikariCP数据库连接测试失败：连接已关闭");
            }
        } catch (SQLException e) {
            System.err.println("HikariCP数据库连接测试失败：" + e.getMessage());
            e.printStackTrace();
        }
    }
}